<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			//创建函数的2种方式
			//1.函数声明
			   //函数声明提升，在执行代码之前会先读取函数声明,可以把函数声明放在调用它的语句后面
					  console.log(fn);
			          function fn(){
			          	
			          }
			          console.log(fn.name);
	        //2.函数表达式
	          //即创建一个函数并将它赋值给变量
			        fn1();//错误：函数还不存在
			        var fn1 = function(){
			        	//创建一个函数并将它赋值给变量 fn1,匿名函数（拉姆达函数），在使用前必须先赋值
			        }
	          //在把函数当成值来使用的情况下，都可以使用匿名函数
			        function createComparisonFunction(propertyName){
				        	return function(object1,object2){
				        		var value1 = object1[propertyName];
					        	var value2 = object2[propertyName];
					        	if(value1 < value2){
					        		return -1;
					        	}else if(value1 > value2){
					        		return 1;
					        	}else{
					        		return 0;
					        	}
				        	}
			        	
			        }
			        var arr = [{name:'ls',age:24,id:5},{name:'xx',age:24,id:4}]
					arr.sort(createComparisonFunction('id'));
					console.log(arr);// [{name:'xx',age:24,id:4},{name:'ls',age:24,id:5}]

	        
	        
	        //递归(函数调用自身)
			         function factorial(num){
						if(num<=1){
							return 1;
						}else{
							return num * factorial(num-1)
						}
					}
					var anotherFactorial = factorial;
					factorial = null;
					anotherFactorial(4);//报错，调用 anotherFactorial()时，由于必须执行 factorial()，而 factorial 已经不再是函数，所以就会导致错误
					
		        //使用arguments.callee解决上述问题,但在严格模式下，不能通过脚本访问 arguments.callee，访问这个属性会导致错误
		            function factorial(num){
						console.log(arguments.callee)
						if(num<=1){
							return 1;
						}else{
							return num * arguments.callee(num-1)
						}
					}
					var anotherFactorial = factorial;
					factorial = null;
					console.log(anotherFactorial(4));//非严格模式下，24
			    //使用命名函数表达式，严格模式和非严格模式都可以
			        var factorial = function f(num){
						if(num<=1){
							return 1;
						}else{
							return num * f(num-1)
						}
					}
					var anotherFactorial = factorial;
					factorial = null;
					console.log(anotherFactorial(4));//24
		</script>
	</body>
</html>
